package com.maozzi.web.controller.rest;

import com.maozzi.api.acl.AclService;
import com.maozzi.api.acl.model.RoleDTO;
import com.maozzi.api.auth.annotation.Login;
import com.maozzi.api.auth.util.SsoUtil;
import com.maozzi.api.blog.BlogService;
import com.maozzi.api.blog.model.BlogDTO;
import com.maozzi.api.user.UserService;
import com.maozzi.common.model.PageDTO;
import com.maozzi.common.model.PageParam;
import com.maozzi.common.model.PageVO;
import com.maozzi.common.util.CloneUtil;
import com.maozzi.common.util.ParamCheckUtil;
import com.maozzi.web.model.BlogVO;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * 博客 controller
 *
 * @author maozi
 */
@RestController
@RequestMapping("rest/blog")
public class BlogController {
    @Resource
    private BlogService blogService;

    @Resource
    private UserService userService;
    @Resource
    private AclService aclService;


    /**
     * 博客分页查询
     *
     * @param vo        查询参数
     * @param pageParam 分页参数
     * @return 返回
     */
    @GetMapping("page.json")
    public PageVO<BlogVO> page(BlogVO vo, PageParam pageParam) {
        ParamCheckUtil.notNull(pageParam, "分页错误");

        BlogDTO dto = CloneUtil.to(vo, BlogDTO.class);

        PageDTO<BlogDTO> page = blogService.page(dto, pageParam);

        return CloneUtil.toPageVO(page, BlogVO.class);
    }

    /**
     * 删除博客
     *
     * @param vo 参数
     * @return 返回
     */
    @PostMapping("del.json")
    public Boolean del(@RequestBody BlogVO vo) {
        ParamCheckUtil.notNull(vo, "参数错误");
        ParamCheckUtil.notNull(vo.getId(), "id 为空");

        blogService.delById(vo.getId());

        return true;
    }

    /**
     * 演示 Seata AT 模式
     * 情景假设：同时在博客表、角色表新增一条记录
     *
     * @return 返回
     */
    @PostMapping("seata/at.json")
    @Login
    @GlobalTransactional(name = "website-blog-at")
    public Boolean seataAt() {

        BlogDTO blogDTO = new BlogDTO();
        blogDTO.setTitle("演示 Seata AT 模式");
        blogDTO.setUserId(SsoUtil.get().getId());
        blogDTO.setImgUrl("https://maozzi.gitlab.io/2024/04/15/java/base/fixed-and-float-point/1.png");
        blogDTO.setDescription("整数和小数在计算机怎么表示——二进制形式。");
        blogDTO.setContent("前言在说定点数和浮点数之前，先回顾一下，整数和小数在计算机怎么表示——二进制形式。进制计数制 生活中常见的是十进制，那么在计算机中，常见的进制： 二进制（B，binary），基本符号0、1");
        blogDTO.setCreateBy(SsoUtil.get().getName());
        blogService.add(blogDTO);

        RoleDTO roleDTO = new RoleDTO();
//        roleDTO.setName("seata-at-role");
        roleDTO.setDescription("seata-at-role 角色");
        aclService.putRole(roleDTO);

        return true;
    }

}
